package top.zk123.chain.wechat;

import org.springframework.web.multipart.MultipartFile;
import top.zk123.chain.bean.ReturnInfo;
import top.zk123.chain.exception.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 微信小程序 业务逻辑层
 *
 * @author Ke Zhang
 * @since 2.1
 */
public interface WechatService {
    /**
     * 像微信服务器发送请求,openId
     *
     * @param code 临时登录凭证
     * @return String
     */
    String getOpenId(String code);

    /**
     * 微信小程序登录操作
     *
     * @param code 临时登录凭证
     * @return ReturnInfo
     */
    ReturnInfo wxLogin(String code);


    /**
     * 更新用户信息
     *
     * @param company   公司
     * @param education 学历
     * @param school    毕业于
     * @return ReturnInfo
     */
    ReturnInfo wxUpdate(String company, String education, String school);

    /**
     * 查询 message
     *
     * @return ReturnInfo
     */
    ReturnInfo wxMessage();

    /**
     * 更改message 列表中证书的授权状态
     *
     * @param certUId 证书 UId
     * @return ReturnInfo
     */
    ReturnInfo wxMessageStateChange(String certUId);


    /**
     * 返回证书包列表
     *
     * @param findAll 是否返回全部
     * @return ReturnInfo
     */
    ReturnInfo wxGetCertList(boolean findAll);

    /**
     * 查询单张证书的详细信息
     *
     * @param certUIdList 证书 UId 列表
     * @return ReturnInfo
     */
    ReturnInfo wxGetCertsByUId(List<Long> certUIdList) throws WXSystemBusyException;


    /**
     * 实名制核验
     *
     * @param cardNo   身份证号
     * @param realName 真实姓名
     * @param face     身份证人脸面图片
     * @param back     身份证背面图片
     * @return ReturnInfo
     * @throws FileUploadException        文件上传失败
     * @throws WrongFileTypeException     不支持的文件类型
     * @throws FileEmptyException         文件为空
     * @throws EmptyStringException       后缀为空
     * @throws FakeIdCardException        假的身份证
     * @throws IdCardExpiredException     身份证过期
     * @throws OCRInputDifferentException 输入与OCR识别结果不一致
     * @throws UserVerifyFailed           人证核验失败
     */
    ReturnInfo wxUserVerify(String cardNo, String realName, String face, String back)
            throws FileUploadException, WrongFileTypeException, FileEmptyException, EmptyStringException,
            FakeIdCardException, IdCardExpiredException, OCRInputDifferentException, UserVerifyFailed;


    /**
     * 微信端导出数字证书
     *
     * @param request
     * @param response
     */
    void wxExportJSON(HttpServletRequest request, HttpServletResponse response, long UId);

    /**
     * 微信分享功能， 生成 activeCode
     *
     * @return ReturnInfo
     * @throws InvalidAccessTokenException 无效Token
     * @throws WXSystemBusyException       微信系统忙
     */
    ReturnInfo wxShare() throws InvalidAccessTokenException, WXSystemBusyException;

    /**
     * 导出微信小程序码
     * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html
     *
     * @param path 扫码进入微信小程序页面路径
     * @return ReturnInfo
     */
    ReturnInfo wxApplicationCodeExport(String path);

    // 获取失效的证书
    ReturnInfo wxGetInvalidCerts() throws NoAuthenticationException, CertificateNotFoundException;

    /*
     *
     *
     *
     *
     *
     * Utils
     *
     *
     *
     *
     *
     *
     */


    /**
     * 生成Token
     *
     * @param openId User标识
     * @return String
     */
    String makeToken(String openId);

    /**
     * 解析Token
     *
     * @param token token
     * @return openId
     */
    String parseToken(String token);

    /**
     * 通过Token获取OpenId
     *
     * @return OpenId
     */
    String getOpenIdByToken();

    /**
     * @param cardNo
     * @param realName
     * @param face
     * @param back
     * @return
     */
    ReturnInfo wxUserVerifyFake(String cardNo, String realName, String face, String back);

    /**
     * 人证核验 照片以链接的形式传入
     *
     * @param cardNo
     * @param realName
     * @param face
     * @param back
     * @return
     */
    ReturnInfo wxUserVerifyWithLink(String cardNo, String realName, String face, String back) throws FakeIdCardException, IdCardExpiredException, OCRInputDifferentException, UserVerifyFailed;

    // 获取 access_token
    String getAccessToken();

    // 获取 activityId
    String createActivityId(String access_token, String openId) throws WXSystemBusyException, InvalidAccessTokenException;

    // 微信认证核验 - 上传图片
    ReturnInfo wxUploadUserPic(MultipartFile file) throws FileEmptyException, WrongFileTypeException, FileUploadException;
}
